home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / Dmod / dmod_Warp3D / examples / w3d_txtr_p96.d < prev    next >
Encoding:
Text File  |  2002-10-28  |  11.1 KB  |  384 lines

  1. // a bit more complex example with (silly) textures, z-buffer, doublebuffering, smoothing for P96+W3D
  2.  
  3. MODULE    'intuition/intuition',
  4.             'intuition/screens',
  5.             'utility/tagitem',
  6.             'graphics/modeid',
  7.             'graphics/view',
  8.             'exec/memory'
  9.  
  10. MODULE    'warp3d',
  11.             'warp3d/warp3d'
  12. MODULE    'libraries/picasso96',
  13.             'picasso96'
  14.  
  15. PROC Go()
  16.     // build all needed vertexes
  17.     DEF    v[8]:W3D_Vertex,n
  18.     DEF    p=[    // cube vertex and colour definition
  19.         -1,-1,-1,    0,0,0,
  20.         +1,-1,-1,    0,0,1,
  21.         +1,-1,+1,    0,1,0,
  22.         -1,-1,+1,    0,1,1,
  23.         -1,+1,-1,    1,0,0,
  24.         +1,+1,-1,    1,0,1,
  25.         +1,+1,+1,    1,1,1,
  26.         -1,+1,+1,    1,1,0]:vertex
  27.     DEF    sqr=[    // squares definition of points ids
  28.         0,3,7,4,        // left
  29.         1,2,6,5,        // right
  30.         0,1,5,4,        // back
  31.         2,3,7,6,        // front
  32.         0,1,2,3,        // bottom
  33.         4,5,6,7]:W    // top
  34.  
  35.     // setup all the vertex colours
  36.     FOR n:=0 TO 7
  37.         v[n].w:=0.0
  38.         v[n].u:=0.0
  39.         v[n].v:=0.0
  40.         v[n].tex3d:=0
  41.         v[n].color.a:=1.0
  42.         v[n].color.r:=p[n].r
  43.         v[n].color.g:=p[n].g
  44.         v[n].color.b:=p[n].b
  45.         v[n].spec.r:=1.0
  46.         v[n].spec.g:=1.0
  47.         v[n].spec.b:=1.0
  48.         v[n].l:=0
  49.     ENDFOR
  50.  
  51.     // preparation of all textures
  52.     DEF    txtr[6]:PTR TO W3D_Texture,err
  53.     FOR n:=0 TO 5 txtr[n]:=NIL
  54.     IFN txtr[0]:=W3D_AllocTexObjTags(context,&err,
  55.         W3D_ATO_IMAGE,[
  56.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  57.             $ffff,$ffff,$ffff,$f005,$f005,$ffff,$ffff,$ffff,
  58.             $ffff,$ffff,$f004,$f004,$f004,$ffff,$ffff,$ffff,
  59.             $ffff,$ffff,$ffff,$f003,$f003,$ffff,$ffff,$ffff,
  60.             $ffff,$ffff,$ffff,$f002,$f002,$ffff,$ffff,$ffff,
  61.             $ffff,$ffff,$ffff,$f001,$f001,$ffff,$ffff,$ffff,
  62.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  63.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  64.             ]:UW,
  65.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  66.         W3D_ATO_WIDTH,8,
  67.         W3D_ATO_HEIGHT,8,
  68.         TAG_END) THEN Raise("TXR",err)
  69.     IFN txtr[1]:=W3D_AllocTexObjTags(context,&err,
  70.         W3D_ATO_IMAGE,[
  71.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  72.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  73.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  74.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  75.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  76.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  77.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  78.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  79.             ]:UW,
  80.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  81.         W3D_ATO_WIDTH,8,
  82.         W3D_ATO_HEIGHT,8,
  83.         TAG_END) THEN Raise("TXR",err)
  84.     IFN txtr[2]:=W3D_AllocTexObjTags(context,&err,
  85.         W3D_ATO_IMAGE,[
  86.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  87.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  88.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  89.             $ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,$ffff,
  90.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  91.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  92.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  93.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  94.             ]:UW,
  95.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  96.         W3D_ATO_WIDTH,8,
  97.         W3D_ATO_HEIGHT,8,
  98.         TAG_END) THEN Raise("TXR",err)
  99.     IFN txtr[3]:=W3D_AllocTexObjTags(context,&err,
  100.         W3D_ATO_IMAGE,[
  101.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  102.             $ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,$ffff,
  103.             $ffff,$ffff,$ffff,$000f,$ffff,$ffff,$ffff,$ffff,
  104.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  105.             $ffff,$ffff,$f000,$ffff,$f000,$ffff,$ffff,$ffff,
  106.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  107.             $ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,$ffff,
  108.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  109.             ]:UW,
  110.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  111.         W3D_ATO_WIDTH,8,
  112.         W3D_ATO_HEIGHT,8,
  113.         TAG_END) THEN Raise("TXR",err)
  114.     IFN txtr[4]:=W3D_AllocTexObjTags(context,&err,
  115.         W3D_ATO_IMAGE,[
  116.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  117.             $ffff,$ffff,$f000,$f000,$f000,$f000,$ffff,$ffff,
  118.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  119.             $ffff,$ffff,$f000,$f000,$f000,$ffff,$ffff,$ffff,
  120.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  121.             $ffff,$ffff,$ffff,$ffff,$ffff,$f000,$ffff,$ffff,
  122.             $ffff,$ffff,$f000,$f000,$f000,$ffff,$ffff,$ffff,
  123.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  124.             ]:UW,
  125.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  126.         W3D_ATO_WIDTH,8,
  127.         W3D_ATO_HEIGHT,8,
  128.         TAG_END) THEN Raise("TXR",err)
  129.     IFN txtr[5]:=W3D_AllocTexObjTags(context,&err,
  130.         W3D_ATO_IMAGE,[
  131.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  132.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  133.             $ffff,$ffff,$f000,$ffff,$ffff,$ffff,$ffff,$ffff,
  134.             $ffff,$ffff,$f000,$f000,$f000,$ffff,$ffff,$ffff,
  135.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  136.             $ffff,$ffff,$f000,$ffff,$ffff,$f000,$ffff,$ffff,
  137.             $ffff,$ffff,$ffff,$f000,$f000,$ffff,$ffff,$ffff,
  138.             $ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,$ffff,
  139.             ]:UW,
  140.         W3D_ATO_FORMAT,W3D_A4R4G4B4,
  141.         W3D_ATO_WIDTH,8,
  142.         W3D_ATO_HEIGHT,8,
  143.         TAG_END) THEN Raise("TXR",err)
  144.  
  145.     // set bilinear filtering for all textures
  146.     FOR n:=0 TO 5 W3D_SetFilter(context,txtr[n],W3D_LINEAR,W3D_LINEAR)
  147.  
  148.     // setup the trifan for the above vertexes
  149.     DEF    trifan:W3D_TrianglesV
  150.     trifan.vertexcount:=4
  151.     trifan.v:=[NIL,NIL,NIL,NIL,NIL]:UL    // prepare the field
  152.     trifan.tex:=NIL
  153.     trifan.st_pattern:=NIL
  154.  
  155.     DEF    msg:PTR TO IntuiMessage,class,next=TRUE
  156.     DEF    angles=[0,0,0,0,0,0]:vertex,ver:PTR TO PTR TO W3D_Vertex
  157.     WHILE next
  158.         IF msg:=GetMsg(window.UserPort)
  159.             SELECT class:=msg.Class
  160.             CASE IDCMP_MOUSEMOVE
  161.                 angles.x:=msg.MouseY/50
  162.                 angles.y:=msg.MouseX/50
  163.             DEFAULT
  164.                 next:=FALSE
  165.             ENDSELECT
  166.             ReplyMsg(msg)
  167.         ENDIF
  168.  
  169.         FOR n:=0 TO 7 Compute3DPoint(v[n],p[n],angles)
  170.  
  171.         // lock hardware to allow to use it
  172.         IF W3D_SUCCESS=W3D_LockHardware(context)
  173.             // crear the screen and the z-buffer
  174.             W3D_ClearDrawRegion(context,0)
  175.             W3D_ClearZBuffer(context,[1]:D)
  176.             // draw all the flats
  177.             FOR n:=0 TO 5
  178.                 ver:=trifan.v
  179.                 ver[0]:=v[sqr[n*4+0]]
  180.                 ver[0].u:=0
  181.                 ver[0].v:=0
  182.                 ver[1]:=v[sqr[n*4+1]]
  183.                 ver[1].u:=7
  184.                 ver[1].v:=0
  185.                 ver[2]:=v[sqr[n*4+2]]
  186.                 ver[2].u:=7
  187.                 ver[2].v:=7
  188.                 ver[3]:=v[sqr[n*4+3]]
  189.                 ver[3].u:=0
  190.                 ver[3].v:=7
  191.                 trifan.tex:=txtr[n]
  192.                 W3D_DrawTriFanV(context,trifan)
  193.             ENDFOR
  194.             W3D_UnLockHardware(context)
  195.         ELSE Raise("LHW")
  196.  
  197.         // swap the buffers
  198.         SwitchBuffers()
  199.     ENDWHILE
  200. EXCEPTDO
  201.     FOR n:=0 TO 5 IF txtr[n] THEN W3D_FreeTexObj(context,txtr[n])
  202.     Raise(exception,exceptioninfo)
  203. ENDPROC
  204.  
  205. PROC Compute3DPoint(pixel:PTR TO W3D_Vertex,vertex:PTR TO vertex,angles:PTR TO vertex)
  206.     DEFD    x,y,z,xx,yy,zz,x1,y1,z1,lminuszz
  207.     x:=vertex.x
  208.     y:=vertex.y
  209.     z:=vertex.z
  210.  
  211.     x1:=x*Cos(angles.z)+y*Sin(angles.z)
  212.     y1:=y*Cos(angles.z)-x*Sin(angles.z)
  213.     xx:=x1*Cos(angles.y)+z*Sin(angles.y)
  214.     z1:=z*Cos(angles.y)-x1*Sin(angles.y)
  215.     zz:=z1*Cos(angles.x)+y1*Sin(angles.x)
  216.     yy:=y1*Cos(angles.x)-z1*Sin(angles.x)
  217.  
  218.     lminuszz:=5-zz
  219.     IF lminuszz>0.0
  220.         x:=xx*5/lminuszz
  221.         y:=-yy*5/lminuszz
  222.     ELSE RETURN
  223.     x*=height/4
  224.     y*=height/4
  225.     x+=width/2
  226.     y+=height/2
  227.     pixel.x:=x
  228.     pixel.y:=y
  229.     pixel.z:=(-zz+5)/10
  230.     pixel.w:=0.1/pixel.z
  231. ENDPROC
  232.  
  233. PROC SwitchBuffers()
  234.     IFN bufnum
  235.         bm:=buf2.BitMap
  236.         W3D_SetDrawRegion(context,bm,0,scissor)
  237.         buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  238.         WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  239.         WaitTOF()
  240.         bufnum:=1
  241.     ELSE
  242.         bm:=buf1.BitMap
  243.         W3D_SetDrawRegion(context,bm,0,scissor)
  244.         buf2.DBufInfo.SafeMessage.ReplyPort:=NIL
  245.         WHILEN ChangeScreenBuffer(screen,buf2);    ENDWHILE
  246.         WaitTOF()
  247.         bufnum:=0
  248.     ENDIF
  249. ENDPROC
  250.  
  251. OBJECT vertex
  252.     x/y/z:F,
  253.     r/g/b:F
  254.  
  255. DEF    Warp3DBase,P96Base
  256.  
  257. DEF    screen:PTR TO Screen,window:PTR TO Window,context:PTR TO W3D_Context,scissor:PTR TO W3D_Scissor,
  258.         width,height,depth,buf1:PTR TO ScreenBuffer,buf2:PTR TO ScreenBuffer,bm:PTR TO BitMap,bufnum
  259.  
  260. PROC main()
  261.     OpenAll()
  262.     Go()
  263. EXCEPTDO
  264.     CloseAll()
  265.     DEF    err,err2=NIL
  266.     SELECT exception
  267.     CASE "P96";    err:='unable to open picasso96api.library'
  268.     CASE "W3D";    err:='unable to open warp3d.library'
  269.     CASE "DRV";    err:='unsuitable 3d driver'
  270.     CASE "MID";    err:='invalid screen mode'
  271.     CASE "SCR";    err:='unable to open screen'
  272.     CASE "SCB";    err:='unable to get screen buffer'
  273.     CASE "P96B";    err:='no picasso96 bitmap: screen buffer '
  274.         err2:=["0"+exceptioninfo,0]:CHAR
  275.     CASE "WIN";    err:='unable to open window'
  276.     CASE "CTX";    err:='unable to build context: '
  277.         SELECT exceptioninfo
  278.         CASE W3D_ILLEGALINPUT;    err2:='illegal input'
  279.         CASE W3D_NOMEMORY;        err2:='no memory'
  280.         CASE W3D_NODRIVER;        err2:='no driver'
  281.         CASE W3D_UNSUPPORTEDFMT;err2:='unsupported format'
  282.         CASE W3D_ILLEGALBITMAP;    err2:='illegal bitmap'
  283.         ENDSELECT
  284.     CASE "LHW";    err:='can''t lock hardware'
  285.     CASE "MEM";    err:='not enough memory'
  286.     CASE "ZBU";    err:='unable to build z-buffer: '
  287.         SELECT exceptioninfo
  288.         CASE W3D_NOGFXMEM;    err2:='no video memory'
  289.         CASE W3D_NOZBUFFER;    err2:='z-bufering not supported'
  290.         ENDSELECT
  291.     DEFAULT;        err:='   ';    StrCopy(err,[exception<<8]:L,3)
  292.     ENDSELECT
  293.     IF exception THEN PrintF('\s\s\n',err,err2)
  294. ENDPROC
  295.  
  296. PROC OpenAll()
  297.     IFN P96Base:=OpenLibrary('Picasso96API.library',0) THEN Raise("P96")
  298.     IFN Warp3DBase:=OpenLibrary('Warp3D.library',0) THEN Raise("W3D")
  299.  
  300.     DEF    flags=W3D_CheckDriver()
  301.     IFN flags&W3D_DRIVER_3DHW||flags&W3D_DRIVER_CPU THEN Raise("DRV")
  302.  
  303.     DEF    modeid
  304.     IF (modeid:=p96RequestModeIDTags(
  305.         P96MA_MinDepth,15,
  306.         P96MA_MaxDepth,32,
  307.         P96MA_MinWidth,320,
  308.         P96MA_MaxWidth,1600,
  309.         P96MA_MinHeight,200,
  310.         P96MA_MaxHeight,1200,
  311.         TAG_END))=INVALID_ID THEN Raise("MID")
  312.  
  313.     IF p96GetModeIDAttr(modeid,P96IDA_ISP96)
  314.         width:=p96GetModeIDAttr(modeid,P96IDA_WIDTH)
  315.         height:=p96GetModeIDAttr(modeid,P96IDA_HEIGHT)
  316.         depth:=p96GetModeIDAttr(modeid,P96IDA_DEPTH)
  317.     ELSE Raise("MID")
  318.     PrintF('DisplayID=$\h\n',modeid)
  319.     PrintF('    Width=\d\n',width)
  320.     PrintF('   Height=\d\n',height)
  321.     PrintF('    Depth=\d\n',depth)
  322.  
  323.     IFN screen:=OpenScreenTags(NIL,
  324.         SA_Width,width,
  325.         SA_Height,height,
  326.         SA_DisplayID,modeid,
  327.         SA_Depth,depth,
  328.         SA_ShowTitle,FALSE,
  329.         SA_Draggable,FALSE,
  330.         TAG_END) THEN Raise("SCR")
  331.  
  332.     // prepare double buffering
  333.     IFN buf1:=AllocScreenBuffer(screen,NIL,SB_SCREEN_BITMAP) THEN Raise("SCB")
  334.     IFN p96GetBitMapAttr(buf1.BitMap,P96IDA_ISP96) THEN Raise("P96B",1)
  335.     IFN buf2:=AllocScreenBuffer(screen,NIL,0) THEN Raise("SCB")
  336.     IFN p96GetBitMapAttr(buf2.BitMap,P96IDA_ISP96) THEN Raise("P96B",2)
  337.     buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  338.     WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  339.     WaitTOF()
  340.     bm:=buf1.BitMap
  341.     bufnum:=0
  342.  
  343.     IFN window:=OpenWindowTags(NIL,
  344.         WA_CustomScreen,screen,
  345.         WA_Width,screen.Width,
  346.         WA_Height,screen.Height,
  347.         WA_Left,0,
  348.         WA_Top,0,
  349.         WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_MOUSEMOVE,
  350.         WA_Flags,WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_REPORTMOUSE,
  351.         TAG_END) THEN Raise("WIN")
  352.  
  353.     DEF    cerr
  354.     IFN context:=W3D_CreateContextTags(&cerr,
  355.         W3D_CC_MODEID,modeid,
  356.         W3D_CC_DRIVERTYPE,W3D_DRIVER_BEST,
  357.         W3D_CC_BITMAP,bm,
  358.         W3D_CC_YOFFSET,0,
  359.         TAG_END) THEN Raise("CTX",cerr)
  360.     IFN W3D_SUCCESS=(cerr:=W3D_AllocZBuffer(context)) THEN Raise("ZBU",cerr)
  361.  
  362.     // setup the rendering usage
  363.     W3D_SetState(context,W3D_TEXMAPPING,W3D_ENABLE)
  364.     W3D_SetState(context,W3D_GOURAUD,W3D_ENABLE)
  365.     W3D_SetState(context,W3D_ZBUFFER,W3D_ENABLE)
  366.     W3D_SetState(context,W3D_PERSPECTIVE,W3D_ENABLE)
  367.     W3D_SetZCompareMode(context,W3D_Z_LESS)
  368.     W3D_Hint(context,W3D_H_BILINEARFILTER,W3D_H_NICE)
  369.  
  370.     scissor:=[0,0,width,height]:W3D_Scissor
  371.     SwitchBuffers()
  372. ENDPROC
  373.  
  374. PROC CloseAll()
  375.     W3D_FreeZBuffer(context)
  376.     IF context THEN W3D_DestroyContext(context)
  377.     IF window THEN CloseWindow(window)
  378.     IF buf2 THEN FreeScreenBuffer(screen,buf2)
  379.     IF buf1 THEN FreeScreenBuffer(screen,buf1)
  380.     IF screen THEN CloseScreen(screen)
  381.     IF Warp3DBase THEN CloseLibrary(Warp3DBase)
  382.     IF P96Base THEN CloseLibrary(P96Base)
  383. ENDPROC
  384.